const Joi = require("@hapi/joi");
const _ = require("lodash");

/**
 * 生成参数校验中间件
 * @param {*} validate
 * @param {*} validate.query 查询字符串校验 ctx.query
 * @param {*} validate.payload 请求体校验 ctx.request.body
 * @param {*} validate [key] 自定义校验 ctx[key]
 */
function validate(validate) {
  const validateFieldMapCtxField = {
    payload: "request.body",
  };
  /**
   * 参数校验中间件
   */
  return async function (ctx, next) {
    for (let validateField in validate) {
      const ctxField = validateFieldMapCtxField[validateField] || validateField; //需要@hapi/joi在v15及以下版本
      const result = Joi.validate(
        _.get(ctx, ctxField),
        validate[validateField]
      );
      if (result && result.error) {
        ctx.response.status = 400;
        ctx.response.body = {
          code: 400,
          error: "参数校验失败!",
          message: result.error.message,
        };
        return;
      }
    }
    await next();
  };
}

module.exports = { validate };
